package cn.hrbnu.service.impl;

import cn.hrbnu.mapper.CommentMapper;
import cn.hrbnu.mapper.UserMapper;
import cn.hrbnu.po.Comment;
import cn.hrbnu.po.User;
import cn.hrbnu.service.CommentService;
import cn.hrbnu.util.AuthContextUtil;
import cn.hrbnu.util.ResponseResult;
import cn.hrbnu.vo.CommentVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @author zhangyadong
 * @version 1.0
 * &#064;ClassName  CommentServiceImpl
 * &#064;date  2025-06-12 8:51
 */

@Service
public class CommentServiceImpl implements CommentService {


    private final CommentMapper commentMapper;

    private final UserMapper userMapper;

    public CommentServiceImpl(CommentMapper commentMapper, UserMapper userMapper) {
        this.commentMapper = commentMapper;
        this.userMapper = userMapper;
    }

    @Override
    public ResponseResult<Object> addComment(Comment comment) {
        User user = AuthContextUtil.get();

        comment.setCreateBy(AuthContextUtil.get().getId());
        comment.setUpdateBy(AuthContextUtil.get().getId());
        comment.setCreateTime(new Date());
        comment.setUpdateTime(new Date());
        comment.setDelFlag(0);
        commentMapper.save(comment);
        return new ResponseResult(200, "操作成功");
    }

    /**
     * 获取评论列表
     *
     * @param articleId 文章ID，用于查询评论
     * @param pageNum    页码，用于分页查询
     * @param pageSize   每页大小，用于分页查询
     * @return 返回包含评论列表的ResponseResult对象
     */
    @Override
    public ResponseResult<Object> commentList(Long articleId, Integer pageNum, Integer pageSize) {
        // 启用分页功能
        PageHelper.startPage(pageNum, pageSize);

        // 根据文章ID获取评论列表
        List<Comment> list = commentMapper.getById(articleId);

        // 将Comment列表转换为CommentVo列表
        List<CommentVo> listVoList = toCommentVoList(list);

        // 创建PageInfo对象，用于获取总记录数
        PageInfo<Comment> pageInfo = new PageInfo<>(list);
        long total = pageInfo.getTotal();


        // 创建Map对象，用于存储总记录数和评论列表
        Map<String, Object> map = new HashMap<>();
        map.put("total", total);
        map.put("rows", listVoList);

        // 返回包含分页评论数据的ResponseResult对象
        return new ResponseResult<>(200, "操作成功", map);
    }


    /**
     * 将评论对象列表转换为评论视图对象列表
     *
     * @param list 评论对象列表，用于转换为视图对象
     * @return 转换后的评论视图对象列表
     */
    private List<CommentVo> toCommentVoList(List<Comment> list) {
        // 初始化一个空的评论视图对象列表
        List<CommentVo> listVoList = new ArrayList<>();

        // 遍历评论对象列表
        for (Comment comment : list) {
            // 创建一个新的评论视图对象
            CommentVo commentVo = new CommentVo();
            // 将评论对象的属性复制到评论视图对象中
            BeanUtils.copyProperties(comment, commentVo);

            // 如果评论的根ID不为-1，表示这不是一个根评论
            if (comment.getRootId()!=-1){
                // 获取回复的评论用户的名称
                String name = userMapper.getById(comment.getToCommentUserId());
                // 设置回复的评论用户的名称到视图对象中
                commentVo.setToCommentUserName(name);
            }

//            // 设置当前用户的昵名为评论视图对象的用户名
            commentVo.setUsername(userMapper.getById(comment.getCreateBy()));

            // 将转换后的评论视图对象添加到列表中
            listVoList.add(commentVo);
        }

        // 返回转换后的评论视图对象列表
        return listVoList;
    }

    private List<CommentVo> getChildren(Long id) {
        List<Comment> list = commentMapper.getByRootId(id);
        return toCommentVoList(list);
    }
}